package com.stu.stusystem.util;

import com.stu.stusystem.common.ApiException;
import com.stu.stusystem.model.em.FileType;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author: cxt
 * @time: 2021/6/25
 */
public class FileTypeJudgeUtil {

    /**
     * 将文件头转换成16进制字符串
     *
     * @param src 原生byte[]
     * @return 16进制字符串
     */
    private static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 根据文件路径获取文件头
     *
     * @param filePath 文件路径
     * @return 文件头
     */
    private static String getFileContent(String filePath) {
        byte[] b = new byte[10];
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            inputStream.read(b, 0, 10);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bytesToHexString(b);
    }

    /**
     * 根据文件头字符串判断文件类型
     *
     * @param fileHead 文件头字符串
     * @return String 文件类型
     */
    private static String judgeType(String fileHead) {
        FileType[] fileTypes = FileType.values();
        for (FileType type : fileTypes) {
            // startsWith 检测是否以指定前缀开始
            String value = type.getValue();
            if (fileHead.toUpperCase().startsWith(value)) {
                return type.toString();
            }
        }
        return null;
    }

    /**
     * 根据文件路径判断文件类型
     *
     * @param filePath 文件路径
     * @return String 文件类型
     */
    public static String getTypeByPath(String filePath) {
        String fileHead = getFileContent(filePath);
        if (fileHead == null || fileHead.length() == 0) {
            throw new ApiException("根据文件路径获取文件头失败");
        }
        return judgeType(fileHead);
    }


    /**
     * 根据文件头字节数进行判断文件类型
     *
     * @param title 10字节文件头数据
     * @return String 文件类型
     */
    public static String getTypeByByte(byte[] title) {
        String fileHead = bytesToHexString(title);
        return judgeType(fileHead);
    }

}
